#include <iostream>

/*

    const：常函数：
        1、使用关键字在函数后面加上 const 关键字
        2、常函数中，对象的属性值不能被修改
        3、在常函数中，不允许调用普通函数，只能调用其他的常函数
    const：常对象：
        1、使用关键字创建一个常对象
        2、常对象可以读取任意属性的值，但不能修改属性的值
        3、常对象只能调用常函数，不能调用普通函数
    mutable：可变属性：
        1、在属性上如果使用了mutable 关键字，则常函数可以对这个属性进行修改
        2、不仅是在常函数中可以修改，在非常函数中也可以修改
*/

class Person
{

private:
    int age;
    std::string name;
    mutable int score;

public:
    Person() : name("刘武周"), age(10), score(100) {}
    Person(int age, std::string name, int score) : age(age), name(name), score(score) {}

    void modify_person(int age, std::string name, int score) const
    {
        // this->age = age; // 加了const 关键字后，对象的属性就没有办法修改了
        // this->name = name;
        this->score = score; // 带有mutable 关键字修饰的属性可以在`常函数`中修改
        // this->display(); // 常函数中不能调用普通函数，
    }

    void display()
    {
        std::cout << "Name：" << name << "\tAge：" << age << "\tScore：" << score << std::endl;
        modify_person(0, "display", 100); // 普通函数中，可以调用const函数，常函数

        std::cout << "Name：" << name << "\tAge：" << age << "\tScore：" << score << std::endl;
        this->score = 9999; // 带有mutable 关键字修饰的属性可以在`普通函数`中修改
        std::cout << "Name：" << name << "\tAge：" << age << "\tScore：" << score << std::endl;
        }
};

int main(int argc, char const *argv[])
{
    

    Person p1 = Person();
    p1.modify_person(10, " ", 10000);

    p1.display(); // Error: the object has type qualifiers that are not compatible with the member function "Person::display"
    return 0;
}
